package com.simpou.tests.rest;

import java.io.IOException;
import java.net.URI;

import javax.ws.rs.core.UriBuilder;

import org.glassfish.grizzly.http.server.HttpServer;

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.container.grizzly2.GrizzlyServerFactory;
import com.sun.jersey.api.core.PackagesResourceConfig;
import com.sun.jersey.api.core.ResourceConfig;


/**
 * Cliente e servidor REST standalone para realização de testes sobre os
 * serviços.
 *
 * @author Jonas Pereira
 * @since 2013-03-12
 */
public class RestClientServerTester {

    /**
     * Servidor.
     */
    private final HttpServer server;
    
    /**
     * Cliente.
     */
    private final RestClientTester client;
    
    /**
     * Configura e inicializa um servidor REST e um cliente para se conectar a
     * ele localmente.
     *
     * @param port Porta de escuta do servidor.
     * @param pkgs Pacotes onde se encontrão as classes de serviço a serem
     * expostas.
     * @throws java.io.IOException if any.
     */
    public RestClientServerTester(final int port, final Client customClient,
        final String... pkgs) throws IOException {
        this.client = new RestClientTester("localhost", port,"");
        final URI uri = UriBuilder.fromUri(this.client.baseUrl).build();
        final ResourceConfig config = new PackagesResourceConfig(pkgs);
        this.server = GrizzlyServerFactory.createHttpServer(uri, config);
    }

    /**
     * Configura e inicializa um servidor REST e um cliente para se conectar a
     * ele localmente.
     *
     * @param port Porta de escuta do servidor.
     * @param pkgs Pacotes onde se encontrão as classes de serviço a serem
     * expostas.
     * @throws java.io.IOException if any.
     */
    public RestClientServerTester(final int port, final String... pkgs)
        throws IOException {
        this(port, Client.create(), pkgs);
    }

    /**
     * Interrompe o servidor.
     */
    public void stop() {
        server.stop();
    }

    /**
     * <p>getResource.</p>
     *
     * @param relPath Caminho do recurso.
     * @return Objeto associado ao recurso solicitado.
     */
    public WebResource getResource(final String relPath) {
        return client.getResource(relPath);
    }

    /**
     * @return Url base do rest.
     */
    public String getBaseUrl() {
        return client.baseUrl;
    }
}
